本文是FAIR发表于ICIR2019上关于轻量卷积和动态卷积的文章,轻量卷积借鉴于深度可分离卷积,在此基础上提出动态卷积,实验结果证明本文提出的两种卷积方式性能不亚于以Transformer为代表的self-attention,可以应用到更多的自然语言处理任务。
Introduction
self-attention是一种有效的机制,自从其被提出以来,应用于多项NLP任务中都有很好的性能提升。但是面对长序列,self-attention受限于其$O(n^{2})$算法复杂度。另外,self-attention可以高效捕捉长期依赖的特性最近也被学者质疑(Why Self-Attention? A Targeted Evaluation of Neural Machine Translation Architectures EMNLP 2018)。此外,在实践中对于长序列的处理需要引入层次结构,而CNN正是利用多层级及多尺度上下文窗口来抽取并整合信息,所以原文作者基于此,深度探索了CNN的改进,提出了一种轻量级(light-weight)以及动态的CNN。
轻量级卷积利用CV领域深度(可分离)卷积(DepthWise)的原型,通过在通道维度上的共享参数大大减少参数量降低算法复杂度;在light-weight的基础上提出动态卷积,即从输入特征量动态计算CNN的权重。
Lightweight Convolution
传统的卷积操作:k是标准CNN的窗口大小,$d_{in}$ 和 $d_{out}$ 分别是输入维度(如词嵌入维度)和输出维度(图中有错误,应该是4而非2),输出维度等于卷积核的数量(参数不同)。
而DepthWise(深度可分离)CNN的思想在于将通道(这里把词向量的不同维度当作不同通道)和区域分开考虑,如下图所示:下图共对应着d个不同的卷积核
准卷积的参数量为 $O(k \times d^{2})$,假设输入输出维度相同,k = 7、d = 1024。深度卷积的参数量为 $O(k \times d = 7168$ (其实就是分组卷积)。这时参数量已经大大减少,而原文对深度卷积的卷积核采取参数共享机制,即将通道分为H组,在分割的每组子通道上实现参数共享,如下图所示:
这时参数量变为 $O(k\times H = 112)$,假设H = 16。作者对权重参数 $W\in R^{H\times k}$ 做了softmax归一化,针对维度k(实际上是对每一个卷积核参数做归一化):
原文中light-weight CNN module整体架构为:
其中GLU是指门控线性单元。
文中也提到dropout正则化,在训练阶段以一定的概率p随机丢弃归一化卷积核W的权重参数。
Dynamic Convolution
A dynamic convolution has kernels that vary over time as a learned function of the individual time steps.
正是因为参数共享机制的DepthWise卷积的实现降低了参数量,因此Dynamic CNN才能够高效的实现。所谓的Dynamic CNN就是在每一时间步预测卷积的权重,它是每一时间步的函数。类似于局部连接,其权重是在每个位置变化的,由模型动态的产生而不是训练后固定。计算公式:
其中映射关系,原文中简单的实现为:
如下图所示:
因此全文的block整体结构如下:
对上图的理解:输入经过输入映射后,通过GLU(相当于卷积的门控机制),分成两个通道:一个直接通过去往LConv,另一个用Dynamic CNN计算权重,两者结合得到LConv的输出,最后经过线性映射得到最终输出。
那么是否因为每步动态产生权重而使得CNN无法并行?其实不是,CNN照样是并行计算。因为K*H 个权重仅仅由输入语句的每一个词产生,其他词对这些权重的产生没有影响,因此权重可以并行产生。接着,由于已经得到权重,那就跟普通CNN并行没有区别,可以直接并行。这样相较于self-attention的算法复杂度降低到O(n) 。
Experiments
Conclusion
本文提出了轻量卷积和动态卷积,实验效果说明优于Transformer,这两种结构未来有可能成为NLP任务中的基础架构,但文中关于这两种结构的理论解释并不多,有待研究。